package compartido.pruebas;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import compartido.EntradaDeIdentificador;
import compartido.IEntidad;
import compartido.RegistroDeIdentificadores;

import persistencia.carreras.ensambladores.xml.RegistrarEnsambladoresDeCarreras;
import persistencia.compartido.Repositorio;
import persistencia.compartido.Tipo;
import persistencia.xml.CodificadorXML;

public class EntidadAutomaticaTest {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}
	
	@Test
	public void CrearEntidadesAutomaticas_RecuperarlasCorrectamente() {
		Repositorio repositorio = new Repositorio(".");
		
		RegistrarEnsambladoresDeCarreras.registrarDelegados();
		CodificadorXML codificador = CodificadorXML.getInstancia();
		codificador.registrarDelegado(EntidadEjemplo.class, EntidadEjemplo.getDelegado());
		
		//Tipo<IEntidad> tipoEjemplo = new Tipo<IEntidad>(EntidadAutomaticaEjemplo.class);
		List<EntidadEjemplo> ejemplos = new ArrayList<EntidadEjemplo>();
		ejemplos.add(new EntidadEjemplo("A"));
		ejemplos.add(new EntidadEjemplo("Z"));
		ejemplos.add(new EntidadEjemplo("B"));

		for (EntidadEjemplo ejemplo : ejemplos)
			repositorio.guardarEntidad(ejemplo);
		
		RegistroDeIdentificadores registro = RegistroDeIdentificadores.getInstancia();
		
		for (Entry<Class<? extends IEntidad>, Long> clave_identificador : registro) {
			EntradaDeIdentificador entrada = new EntradaDeIdentificador(clave_identificador.getKey(), clave_identificador.getValue());
			repositorio.guardarEntidad(entrada);
		}
		
		repositorio.guardar();
		registro.limpiar();
		
		Tipo<IEntidad> tipoIdentificadores = new Tipo<IEntidad>(EntradaDeIdentificador.class);
		Iterator<IEntidad> ids = repositorio.iterarEntidades(tipoIdentificadores);
		if (ids != null) {
			while (ids.hasNext()) {
				IEntidad entidad = (IEntidad)ids.next();
				if (entidad instanceof EntradaDeIdentificador) {
					EntradaDeIdentificador entrada = (EntradaDeIdentificador)entidad;
					Class<? extends IEntidad> clase = entrada.getClase();
					long ultimoIdentificador = entrada.getUltimoIdentificador();
					registro.cargar(clase, ultimoIdentificador);
					
				}
			}
		}
	}
	
}
